// 
//  Copyright 2011  reda
// 
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
// 
//        http://www.apache.org/licenses/LICENSE-2.0
// 
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.
using System.Collections.Generic;
using NHibernate.Validator.Constraints;
using System;
using System.Linq;

namespace ManiacMusicManager.Data.Core
{
	/// <summary>
	/// Représente un album
	/// </summary>
	public class Album : Entity
	{
		public Album ()
			: base()
		{
			this.Artistes	= new List<Artiste>();
			this.Chansons	= new List<Chanson>();
			this.AlbumTags		= new List<string>();
		}
		
		#region Properties
		
		/// <summary>
		/// Nom d'album qui sera utilisé pour un tri par ordre alphabétique
		/// </summary>
		[NotNullNotEmpty]
		public virtual string SortName {
			get;
			set;
		}
		
		/// <summary>
		/// Année de sortie de l'album
		/// </summary>
		[NotNull]
		public virtual uint? AnneeDeSortie {
			get;
			set;
		}
		
		/// <summary>
		/// Lien wikipedia vers le l'article traitant de l'album
		/// </summary>
		[NotNullNotEmpty]
		public virtual string WikipediaURL {
			get;
			set;
		}
		
		/// <summary>
		/// Liste des artistes ayant participé à l'album courant
		/// </summary>
		[NotNullNotEmpty]
		public virtual IEnumerable<Artiste> Artistes {
			get;
			private set;
		}
		
		/// <summary>
		/// Liste des chansons qui figurent sur l'album courant
		/// </summary>
		[NotNullNotEmpty]
		public virtual IEnumerable<Chanson> Chansons {
			get;
			private set;
		}
		
		/// <summary>
		/// Liste de mots clefs liés à l'album courant
		/// </summary>
		public virtual IList<string> AlbumTags {
			get;
			set;
		}
		
		/// <summary>
		/// Identifiant MusicBrainz de l'album courant
		/// </summary>
		[NotNullNotEmpty]
		public virtual string MusicBrainzId {
			get;
			set;
		}
		#endregion
		
	#region Link/Unlink Artiste
		/// <summary>
		/// Lier avec un <see cref="Artiste"/>
		/// </summary>
		/// <param name="obj">
		/// Objet à lier
		/// </param>
		public virtual void LinkArtiste(Artiste obj) {
			if(! this.Artistes.Contains(obj))
				(this.Artistes as IList<Artiste>).Add(obj);
			
			if(! obj.Albums.Contains(this))
				(obj.Albums as IList<Album>).Add(this);
		}
		
		/// <summary>
		/// Delier un <see cref="Artiste"/>
		/// </summary>
		/// <param name="obj">
		/// Objet à lier
		/// </param>
		public virtual void UnlinkArtiste(Artiste obj) {
			if(this.Artistes.Contains(obj))
				(this.Artistes as IList<Artiste>).Remove(obj);
			
			if(obj.Albums.Contains(this))
				(obj.Albums as IList<Album>).Remove(this);
		}
	#endregion

	#region Link/Unlink Chanson
		/// <summary>
		/// Lier avec un <see cref="Chanson"/>
		/// </summary>
		/// <param name="obj">
		/// Objet à lier
		/// </param>
		public virtual void LinkChanson(Chanson obj) {
			if(! this.Chansons.Contains(obj))
				(this.Chansons as IList<Chanson>).Add(obj);
			
			if(! obj.Albums.Contains(this))
				(obj.Albums as IList<Album>).Add(this);
		}
		
		/// <summary>
		/// Delier un <see cref="Chanson"/>
		/// </summary>
		/// <param name="obj">
		/// Objet à lier
		/// </param>
		public virtual void UnlinkChanson(Chanson obj) {
			if(this.Chansons.Contains(obj))
				(this.Chansons as IList<Chanson>).Remove(obj);
			
			if(obj.Albums.Contains(this))
				(obj.Albums as IList<Album>).Remove(this);
		}
	#endregion

	}
}

